﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
//
//不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
//
//元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
//int removeElement(int* nums, int numsSize, int val)
//{
//	int left = 0, right = 0;
//	while (right < numsSize)
//	{
//		if (nums[right] == val)
//		{
//			right++;
//			continue;
//		}
//		nums[left++] = nums[right++];
//	}
//	return left;
//}
//int main()
//{
//	int arr[] = { 1,1,1,1,1,1,2,1,1,14,4,2,1,2,1 };
//	int n = removeElement(arr, sizeof(arr) / sizeof(arr[0]), 1);
//	for (int i = 0; i < n; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	return 0;
//}



//给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
//
//由于在某些语言中不能改变数组的长度，所以必须将结果放在数组nums的第一部分。更规范地说，如果在删除重复项之后有 k 个元素，那么 nums 的前 k 个元素应该保存最终结果。
//
//将最终结果插入 nums 的前 k 个位置后返回 k 。
//
//不要使用额外的空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

//int removeDuplicates(int* nums, int numsSize) {
//    //双指针：
//    int sole1 = 0, sole2 = 1;
//    while (sole2 < numsSize)
//    {
//        if (nums[sole2 - 1] != nums[sole2])
//            nums[++sole1] = nums[sole2++];
//        else
//            sole2++;
//    }
//    return sole1 + 1;
//}
//
//int main()
//{
//	int arr[] = { 1,2,2,2,3,3,3,4,4,4,8,8,9,10,10 };
//	int n = removeDuplicates(arr, sizeof(arr) / sizeof(arr[0]));
//	for (int i = 0; i < n; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	return 0;
//}


//给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
//
//请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。
//
//注意：最终，合并后数组不应由函数返回，而是存储在数组 nums1 中。
//
//为了应对这种情况，nums1 的初始长度为 m + n，其中前 m 个元素表示应合并的元素，后 n 个元素为 0 ，应忽略。nums2 的长度为 n 。
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
//{
//	int top1 = m - 1, top2 = n - 1, top3 = nums1Size - 1;
//	while (top1 >= 0 && top2 >= 0)
//	{
//		if (nums1[top1] > nums2[top2])
//		{
//			nums1[top3--] = nums1[top1--];
//		}
//		else
//			nums1[top3--] = nums2[top2--];
//	}
//	while (top2 >= 0)
//	{
//		nums1[top3--] = nums2[top2--];
//	}
//}
//int main()
//{
//	int arr1[10] = { 2, 3, 4, 5, 0, 0, 0, 0, 0, 0 };
//	int arr2[6] = { 1, 2, 3, 6, 7, 8 };
//	merge(arr1, 10, 4, arr2, 6, 6);
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	printf("\n");
//}
